
package com.annvcit.graph;


/**
 * @author annvcit
 * @full_name Nguyen Van Chuc An
 * @date_created Dec 16, 2014
 * @email annvcit@gmail.com
 */
public class DirectedGraph extends AGraph {

	public DirectedGraph(String fileName) {
		super(fileName);
	}

	public DirectedGraph (int[][] am, int verties) {
		super(am, verties);
	}
	
	// tính nữa bậc trong của đỉnh cho trước
	public int inDeg(int v) {
		int intDeg = 0;
		for (int i = 0; i < verties; i++) {
			intDeg += adjMtrx[i][v];
		}
		return intDeg;
	}
	
	// tính nữa bậc ngoài của đỉnh cho trước
	public int outDeg(int v) {
		int outDeg = 0;
		for (int i = 0; i < verties; i++) {
			outDeg += adjMtrx[v][i];
		}
		return outDeg;
	}
	
	// tính số cạnh của đồ thị
	public int edges() {
		int edges = 0;
		for (int i = 0; i < verties; i++) {
			edges += inDeg(i);
		}
		return edges;
	}

	@Override
	public void removeEdge(int v1, int v2) {
		adjMtrx[v1][v2]--;
	}
	
	// kiểm tra liên thông yếu
	public boolean isWeaklyConnected() {
		int[][] am = arrayConverter(adjMtrx);
		UndirectedGraph ug = new UndirectedGraph(am, verties);
		return ug.isConnected();
	}

	private int[][] arrayConverter(int[][] adjMtrx) {
		int[][] result = new int[verties][verties];
		for (int i = 0; i < verties; i++) {
			for (int j = 0; j < verties; j++) {
				if (adjMtrx[i][j] > 0) {
					result[i][j] = adjMtrx[i][j];
					result[j][i] = adjMtrx[i][j];
				}
			}
		}
		return result;
	}
}
